#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void PrintPending(sigset_t &pending)
{
    std::cout << "curr process " << getpid() << " pending: ";
    for(int signo = 31; signo >= 1; signo--)
    {
        if(sigismember(&pending, signo))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << "\n";
}

void handler(int signo)
{
    std::cout << signo << " 号信号被递达" << std::endl;

    std::cout << "--------------------------------" << std::endl;
    sigset_t pending;
    sigpending(&pending);
    PrintPending(pending);
    std::cout << "--------------------------------" << std::endl;
}

int main()
{
    // 0. 捕捉2号信号
    signal(2, handler); // 自定义捕捉
    // 1. 屏蔽2号信号
    sigset_t block_set, old_set;
    sigemptyset(&block_set);
    sigemptyset(&old_set);

    sigaddset(&block_set, SIGINT);

    // 1.1设置进入进程的block表

    sigprocmask(SIG_BLOCK, &block_set, &old_set); //完成对2号信号的屏蔽

    int cnt = 15;
    while(true)
    {
        // 2. 获取当前进程的pending信号集
        sigset_t pending;
        sigpending(&pending);

        // 3. 打印pending信号集
        PrintPending(pending);

        // 4. 解除对2号信号的屏蔽
        if(cnt-- == 0)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK, &old_set, &block_set);
        }


        sleep(1);
    }

    return 0;
}